package org.asiainfo.system.service;

import java.util.List;

import cn.hutool.core.lang.tree.Tree;
import org.asiainfo.system.domain.vo.SysDeptVo;
import org.asiainfo.system.domain.bo.SysDeptBo;
import org.asiainfo.system.domain.SysDept;
import com.mybatisflex.core.service.IService;

/**
 * 部门信息表Service接口
 *
 * @author dotor-ww
 * @since 2024-01-20 22:05:32
 */
public interface SysDeptService extends IService<SysDept> {

    /**
     * 通过deptId查询单条数据
     *
     * @param deptId 主键
     * @return 实例对象
     */
    SysDeptVo queryById(Long deptId);

    /**
     * 查询
     *
     * @param sysDeptBo 筛选条件
     * @return 查询结果
     */
    List<SysDeptVo> queryList(SysDeptBo sysDeptBo);

    /**
     * 新增数据
     *
     * @param sysDeptBo 实例对象
     * @return 实例对象
     */
    Boolean insertByBo(SysDeptBo sysDeptBo);

    /**
     * 修改数据
     *
     * @param sysDeptBo 实例对象
     */
    Boolean updateByBo(SysDeptBo sysDeptBo);

    /**
     * 通过主键删除数据
     *
     * @param deptId 主键
     */
    Boolean deleteWithValidById(Long deptId);

    /**
     * 校验部门是否有数据权限
     *
     * @param deptId 部门ID
     */
    void checkDeptDataScope(Long deptId);

    /**
     * 角色ID查询部门树信息
     *
     * @param roleId 角色ID
     * @return 查询结果
     */
    List<Long> selectDeptIdsByRoleId(Long roleId);

    /**
     * 查询部门下拉树结构
     *
     * @param sysDeptBo 实体
     * @return 查询结果
     */
    List<Tree<Long>> selectDeptTree(SysDeptBo sysDeptBo);

    /**
     * 查询部门下拉树结构
     *
     * @param sysDeptVos 实体
     * @return 构造结果
     */
    List<Tree<Long>> buildDeptTreeSelect(List<SysDeptVo> sysDeptVos);

    /**
     * 校验部门名称是否唯一
     *
     * @param sysDeptBo 实体
     * @return 校验结果
     */
    Boolean checkDeptNameUnique(SysDeptBo sysDeptBo);

    /**
     * 查询所有子部门数(正常)
     *
     * @param deptId 部门ID
     * @return 查询结果
     */
    Long selectNormalChildrenByDeptId(Long deptId);

    /**
     * 查询部门是否存在用户
     *
     * @param deptId 部门ID
     * @return 查询结果
     */
    Boolean checkDeptExistUser(Long deptId);

    /**
     * 是否存在部门子节点
     *
     * @param deptId 部门ID
     * @return 查询结果
     */
    Boolean hasChildByDeptId(Long deptId);

    /**
     * 通过部门ID查询部门名称
     *
     * @param deptIds 部门ID串逗号分隔
     * @return 部门名称串逗号分隔
     */
    String selectDeptNameByIds(String deptIds);

    /**
     * 通过部门ID查询部门
     *
     * @param deptIds 部门IDs
     * @return 部门列表
     */
    List<SysDeptVo> selectDeptByIds(List<Long> deptIds);
}
